import Request from '../request';
import config from '@/service/config';
import { storage } from '@/utils/storage-util';
import { LOGIN_TOKEN } from '@/global/constants';
import { ElMessage } from 'element-plus';

/**
 * 注意响应的结果是一个对象，这个对象包含了服务器的状态码，这个对象下的data才是我们想要的数据，而结果是data.data
 */
const { BASE_URL, TIME_OUT } = config;
export const request = new Request({
  baseURL: BASE_URL,
  timeout: TIME_OUT,
  interceptors: {
    resFailCallback: (error: any) => {
      handlerResponseFail(error);
      console.error('响应拦截失败', error);
    },
    reqSuccessCallback: (config) => {
      const token = storage.get(LOGIN_TOKEN);
      if (token) {
        config.headers.Authorization = 'Bearer ' + token;
      }
      return config;
    },
    resSuccessCallback: (res: any) => {
      console.log('响应拦截成功', res);
      res = handlerResponse(res);
      return res;
    },
    reqFailCallback: (error: any) => {
      handlerResponseFail(error);
    }
  }
});

function handlerResponse(res: any): any | string {
  if (res.status >= 200 && res.status < 300) {
    const data = res.data;
    if (data.code === 0) return data.data;
    return Promise.reject(data.msg);
  } else {
    if (300 <= res.status && res.status < 400) {
      console.log('资源已转移到其他路径');
    } else if (res.status === 400) {
      ElMessage.error('请求内容有误，请联系管理员');
    } else if (res.status === 401) {
      ElMessage.error('登录已过期，请重新登录！');
      storage.remove(LOGIN_TOKEN);
    } else if (402 <= res.status && res.status < 500) {
      console.log('客户端发送的请求异常');
    } else if (res.status >= 500) {
      console.log('服务器内部错误');
    }
    return Promise.reject('响应结果异常，状态码为' + res.status);
  }
}

function handlerResponseFail(err: any): any {
  if (err.request.status === 401) {
    if (err.response.request.responseURL === 'http://localhost:8080/dev/role') {
      ElMessage.warning('该服务器上的该接口不允许修改角色权限！');
      return;
    }
  }
}
